package backing;

import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;

import javax.ejb.CreateException;
import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;

import pe.gob.onp.util.Constante;
import pe.gob.onp.util.LazyLoadingList;
import pe.gob.onp.util.WidgetCreator;
import pe.gob.onp.util.WidgetCreatorException;
import pe.gob.onp.workflow.action.CGenericController;
import pe.gob.onp.workflow.bean.LazyCliente;

import com.bean.BCliente;
import com.bean.BClientePK;
import com.bean.BDepartamento;
import com.bean.BDepartamentoPK;
import com.bean.BEmpresa;
import com.bean.BEmpresaPK;
import com.bean.BPais;
import com.bean.BPaisPK;
import com.bean.BTipoCliente;
import com.bean.BTipoClientePK;
import com.ejbs.ESCliente;
import com.ejbs.ESDepartamento;
import com.ejbs.ESEmpresa;
import com.ejbs.ESPais;
import com.ejbs.ESTipoCliente;
import com.icesoft.faces.component.ext.HtmlDataTable;
import com.util.Factory;

public class Cliente extends CGenericController{
	
	private List lstEmpresas;
	private List lstPaises;
	private List lstDepartamentos;
	
	private BCliente bcliente;
	private util util;
	
	ESCliente escliente = null;
	ESEmpresa esempresa = null;
	ESTipoCliente estipocliente = null;
	ESDepartamento esdepartamento = null;
	ESPais espais = null;
	
	private String idCliente;
	private String idEmpresa;
	private String mensaje;
	
	//Datatable para el popupTipoCliente
	private boolean muestraPopUpTipoCliente;
	private HtmlDataTable dtTipoCliente;
	Hashtable htDataTableProperties;
	//Lista paginada para popupTipoCliente
	private List lstPaginada;
	private LazyCliente lstLazyTipoCliente;
	private boolean readOnly;	

	public Cliente()throws RemoteException, CreateException, WidgetCreatorException{
		lstEmpresas = new ArrayList();
		lstPaises = new ArrayList();
		lstDepartamentos = new ArrayList();
		inicializarCliente();
		esempresa = Factory.getEmpresa();
		ejbBase = Factory.getCliente();
		estipocliente = Factory.getTipoCliente();
		esdepartamento = Factory.getDepartamento();
		espais = Factory.getPais();
		util = new util();
		beanBusqueda = new BCliente();
	}

	public String getIdCliente() {
		return idCliente;
	}

	public void setIdCliente(String idCliente) {
		this.idCliente = idCliente;
	}

	public String getIdEmpresa() {
		return idEmpresa;
	}

	public void setIdEmpresa(String idEmpresa) {
		this.idEmpresa = idEmpresa;
	}

	public String getMensaje() {
		return mensaje;
	}
	public void setMensaje(String mensaje) {
		this.mensaje = mensaje;
	}	
	public util getUtil() {
		return util;
	}
	public void setUtil(util util) {
		this.util = util;
	}
	public ESDepartamento getEsdepartamento() {
		return esdepartamento;
	}
	public void setEsdepartamento(ESDepartamento esdepartamento) {
		this.esdepartamento = esdepartamento;
	}
	public ESPais getEspais() {
		return espais;
	}
	public void setEspais(ESPais espais) {
		this.espais = espais;
	}	
	public ESCliente getEscliente() {
		return escliente;
	}
	public void setEscliente(ESCliente escliente) {
		this.escliente = escliente;
	}
	public ESEmpresa getEsempresa() {
		return esempresa;
	}
	public void setEsempresa(ESEmpresa esempresa) {
		this.esempresa = esempresa;
	}
	public ESTipoCliente getEstipocliente() {
		return estipocliente;
	}
	public void setEstipocliente(ESTipoCliente estipocliente) {
		this.estipocliente = estipocliente;
	}
	public BCliente getBcliente() {
		return bcliente;
	}
	public void setBcliente(BCliente bcliente) {
		this.bcliente = bcliente;
	}
	public List getLstDepartamentos() {
		return lstDepartamentos;
	}
	public void setLstDepartamentos(List lstDepartamentos) {
		this.lstDepartamentos = lstDepartamentos;
	}
	public List getLstPaises() {
		return lstPaises;
	}
	public void setLstPaises(List lstPaises) {
		this.lstPaises = lstPaises;
	}
	public List getLstEmpresas() {
		return lstEmpresas;
	}
	public void setLstEmpresas(List lstEmpresas) {
		this.lstEmpresas = lstEmpresas;
	}
	
	public boolean isMuestraPopUpTipoCliente() {
		return muestraPopUpTipoCliente;
	}

	public void setMuestraPopUpTipoCliente(boolean muestraPopUpTipoCliente) {
		this.muestraPopUpTipoCliente = muestraPopUpTipoCliente;
	}

	public HtmlDataTable getDtTipoCliente() {
		return dtTipoCliente;
	}

	public void setDtTipoCliente(HtmlDataTable dtTipoCliente) {
		this.dtTipoCliente = dtTipoCliente;
	}
	
	public Hashtable getHtDataTableProperties() {
		return htDataTableProperties;
	}

	public void setHtDataTableProperties(Hashtable htDataTableProperties) {
		this.htDataTableProperties = htDataTableProperties;
	}
	
	public List getLstPaginada() {
		return lstPaginada;
	}

	public void setLstPaginada(List lstPaginada) {
		this.lstPaginada = lstPaginada;
	}

	public LazyCliente getLstLazyTipoCliente() {
		return lstLazyTipoCliente;
	}

	public void setLstLazyTipoCliente(LazyCliente lstLazyTipoCliente) {
		this.lstLazyTipoCliente = lstLazyTipoCliente;
	}
	
	public boolean isReadOnly() {
		return readOnly;
	}

	public void setReadOnly(boolean readOnly) {
		this.readOnly = readOnly;
	}

		/**********METHODS***********/

	
	public String iniciar()throws Exception{
		System.out.println("Cliente - inicio");
		mensaje = "";		
		lstEmpresas = util.cargaEmpresas(esempresa.listar());
		lstPaises = util.cargaPaisesList(espais.listar());
		lstDepartamentos = util.cargaDepartamento(new ArrayList());
		inicializarCliente();	
		cargarListaPaginada();
		setReadOnly(false);
		
		return "cliente";
	}	
	
	public String registrarCliente(ActionEvent e)throws Exception{
		System.out.println("registrarCliente");
		mensaje = "";
		bcliente.getPk().setIdEmpresa(bcliente.getEmpresa().getPk().getIdEmpresa());
		
		/*if(escliente.existe(bcliente) == true){
			System.out.println("ya existe");
			mensaje = "este cliente ya existe";
		}
		else{*/
			setBean(bcliente);
			super.registrar();
			HashMap map = new HashMap();
			map.put("begin", "0");
			map.put("end", "5");
			inicializarCliente();
			this.ejbBase.listar(map);
			
//		}	
		return "listado";
	}
	
	public String editarCliente()throws Exception{
		System.out.println("Cliente - editarCliente");
		mensaje = "";
		
		bcliente = (BCliente)buscar(beanBusqueda);
		setReadOnly(false);
		
		cargarListaPaginada();
		
		if(bcliente != null){
			System.out.println("este usuario si existe");
			limpiarListas();
			lstEmpresas = util.cargaEmpresas(esempresa.listar());
			lstPaises = util.cargaPaisesList(espais.listar());
			lstDepartamentos = util.cargaDepartamento(esdepartamento.ListXPais(bcliente.getDepartamento().getPais().getPk()));
			return "cliente";
		}
		else{
			System.out.println("este usuario no existe");
			return "listado";
		}	
		
	}
	
	public void ver(ActionEvent e)throws Exception{
		System.out.println("Cliente - ver");
		bcliente = (BCliente)buscar(beanBusqueda);
		
		cargarListaPaginada();
		
		if(bcliente != null){
			System.out.println("este usuario si existe");
			limpiarListas();
			lstEmpresas = util.cargaEmpresas(esempresa.listar());
			lstPaises = util.cargaPaisesList(espais.listar());
			lstDepartamentos = util.cargaDepartamento(esdepartamento.ListXPais(bcliente.getDepartamento().getPais().getPk()));
			//Se pone el flag en TRUE para poner los componentes de la pantalla en modo vista
			setReadOnly(true);
		}	
		
	}
	
	public String cargarDepartamento(ValueChangeEvent event)throws Exception{
		System.out.println("Cliente - cargarDepartamento");
		String pk = (String)event.getNewValue();
		BPais pais = new BPais();
		pais.setPk(new BPaisPK());
		pais.getPk().setIdPais(pk);
		lstDepartamentos = util.cargaDepartamento(esdepartamento.ListXPais(pais.getPk()));
		return "";
	}
	
	public void inicializarCliente(){
		bcliente = new BCliente();
		bcliente.setPk(new BClientePK());
		bcliente.setEmpresa(new BEmpresa());
		bcliente.getEmpresa().setPk(new BEmpresaPK());
		bcliente.setDepartamento(new BDepartamento());
		bcliente.getDepartamento().setPk(new BDepartamentoPK());
		bcliente.getDepartamento().setPais(new BPais());
		bcliente.getDepartamento().getPais().setPk(new BPaisPK());
		bcliente.setTipoCliente(new BTipoCliente());
        bcliente.getTipoCliente().setPk(new BTipoClientePK());
	}
	
	public String regresar(ActionEvent e){
		inicializarCliente();
		return "listado";
	}
	
	public void limpiarListas(){
		lstEmpresas.clear();
		lstDepartamentos.clear();
		lstPaises.clear();
	}
	
	public String abrirPopUpTipoCliente(){
		System.out.println("Cliente - abrirPopUpTipoCliente");
		if(this.muestraPopUpTipoCliente == false){
			System.out.println("MostrarPopUp = false, entonces se crea datatable");
			setMuestraPopUpTipoCliente(true);	
		}else{
			System.out.println("MostrarPopUp = true, entonces se oculta popUpTipoCliente");
			setMuestraPopUpTipoCliente(false);
		}
		return null;
	}
	
	public void modificar(ActionEvent e) throws RemoteException{
		System.out.println("CGenericController - modificar");
		ejbBase.actualizar(bean);
		inicializarCliente();		
	}
	
	public void abrirPopUpTipoCliente(ActionEvent e) throws WidgetCreatorException{
		abrirPopUpTipoCliente();
	}	


	public String limpiar(){
		System.out.println("Cliente - limpiar");
		bcliente.getTipoCliente().setCo_tipo_clie("");
		bcliente.getTipoCliente().setNo_tipo_clie("");
		return "cliente";

	}
	
	public void inicializarComponentes(){
		this.htDataTableProperties = new Hashtable();
		List lstNombreColumnas = new ArrayList();
		lstNombreColumnas.add("Cod.Cliente");
		lstNombreColumnas.add("Nombre");
		
		Hashtable htColumnBinding = new Hashtable();
		htColumnBinding.put("Cod.Cliente", "#{tcliente.co_tipo_clie}");
		htColumnBinding.put("Nombre", "#{tcliente.no_tipo_clie}");
		
		htDataTableProperties.put(Constante.DATATABLE_PREFIX, "dtbCliente");
		htDataTableProperties.put(Constante.DATATABLE_SOURCE_LIST, lstPaginada);
		htDataTableProperties.put(Constante.DATATABLE_HEADER_LIST, lstNombreColumnas);
		htDataTableProperties.put(Constante.DATATABLE_NUMBER_ROWS, new Integer(5));
		htDataTableProperties.put(Constante.DATATABLE_VAR, "tcliente");
		htDataTableProperties.put(Constante.DATATABLE_WIDTH, "800px");
		htDataTableProperties.put(Constante.DATATABLE_SOURCE_LIST_BINDING,"#{cliente.lstPaginada}");
		htDataTableProperties.put(Constante.DATATABLE_COLUMN_BINDING, htColumnBinding);
	}
	
	public void cargarListaPaginada() throws Exception{
		//Se crea lista paginada
		lstLazyTipoCliente = new LazyCliente(this.estipocliente);
    	lstLazyTipoCliente.setSize(estipocliente.contarFilas());
    	lstPaginada = new LazyLoadingList(lstLazyTipoCliente,5);
    	
    	inicializarComponentes();
		htDataTableProperties.put(Constante.DATATABLE_WIDTH, "400px");
    	htDataTableProperties.put(Constante.DATATABLE_PREFIX, "dtbTipoCliente");
    	this.dtTipoCliente = WidgetCreator.crearDataTable(htDataTableProperties);
		
	}
}
